package com.j2eefast.common.core.utils;


import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

/**
 *  * 订单编码码生成器，生成32位数字编码，
 *  * @生成规则 1位单号类型+17位时间戳+14位(用户id加密&随机数)
 *  * Date:2017年9月8日上午10:05:19
 *  * @author yhli
 *  
 */
public class OrderCodeFactory {

    //region CRM基本数据开头
    /**
     * 订单类别头
     */
    private static final String ORDER_CODE = "1";
    /**
     * 退货类别头
     */
    private static final String RETURN_ORDER = "2";
    /**
     * 退款类别头
     */
    private static final String REFUND_ORDER = "3";
    /**
     * 未付款重新支付别头
     */
    private static final String AGAIN_ORDER = "4";



    /**
     * 随即编码
     */
    private static final int[] r = new int[]{7, 9, 6, 2, 8, 1, 3, 0, 5, 4};
    /**
     * 用户id和随机数总长度
     */
    private static final int maxLength = 14;

    /**
     *  * 更具id进行加密+加随机数组成固定长度编码
     *  
     */
    private static String toCode(Long id) {
        String idStr = id.toString();
        StringBuilder idsbs = new StringBuilder();
        for (int i = idStr.length() - 1; i >= 0; i--) {
            idsbs.append(r[idStr.charAt(i) - '0']);
        }
        return idsbs.append(getRandom(maxLength - idStr.length())).toString();
    }

    /**
     *  * 生成时间戳
     *  
     */
    private static String getDateTime() {
        DateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        return sdf.format(new Date());
    }

    /**
     *  * 生成固定长度随机码
     *  * @param n长度
     *  
     */
    private static long getRandom(long n) {
        long min = 1, max = 9;
        for (int i = 1; i < n; i++) {
            min *= 10;
            max *= 10;
        }
        long rangeLong = (((long) (new Random().nextDouble() * (max - min)))) + min;
        return rangeLong;
    }

    /**
     *  * 生成不带类别标头的编码
     *  * @param userId
     *  
     */
    private static synchronized String getCode(Long userId) {
        userId = userId == null ? 10000 : userId;
        return getDateTime() + toCode(userId);
    }

    /**
     *  * 生成订单单号编码
     *  * @param userId
     *  
     */
    public static String getOrderCode(Long userId) {
        return ORDER_CODE + getCode(userId);
    }



    /**
     *  * 生成退货单号编码
     *  * @param userId
     *  
     */
    public static String getReturnCode(Long userId) {
        return RETURN_ORDER + getCode(userId);
    }

    /**
     *  * 生成退款单号编码
     *  * @param userId
     *  
     */
    public static String getRefundCode(Long userId) {
        return REFUND_ORDER + getCode(userId);
    }

    /**
     *  * 未付款重新支付
     *  * @param userId
     *  
     */
    public static String getAgainCode(Long userId) {
        return AGAIN_ORDER + getCode(userId);
    }

    //endregion


    // region  ERP流水号开头及方法调用
    /**
     * 人事付款流水号开头
     */
    private static final String PERSON_FK_AGAIN = "EFK";
    /**
     * 人事报销流水号开头
     */
    private static final String PERSON_BX_AGAIN = "EBX";
    /**
     * 人事账户更新流水号开头
     */
    private static final String PERSON_ZH_AGAIN = "EZH";
    /**
     * 人事借款流程流水号开头
     */
    private static final String PERSON_JK_AGAIN = "EJK";
    /**
     * 人事还款流程流水号开头
     */
    private static final String PERSON_HK_AGAIN = "EHK";
    /**
     * 人事部门备用金申请流水号开头
     */
    private static final String PERSON_BY_AGAIN = "EBY";
    /**
     * 采购单流水号
     */
    private static final String PERSON_CG_AGAIN = "ECG";

    /**
     *  * 生成人事付款流水号
     *  * @param userId
     *  
     */
    public static String generateFKAgain(Long userId) {
        return PERSON_FK_AGAIN + getCode(userId);
    }

    /**
     *  * 生成人事报销流水号
     *  * @param userId
     *  
     */
    public static String generateBXAgain(Long userId) {
        return PERSON_BX_AGAIN + getCode(userId);
    }

    /**
     *  * 生成人事账户更新流水号
     *  * @param userId
     *  
     */
    public static String generateZHAgain(Long userId) {
        return PERSON_ZH_AGAIN + getCode(userId);
    }

    /**
     *  * 生成人事借款流水号
     *  * @param userId
     *  
     */
    public static String generateJKAgain(Long userId) {
        return PERSON_JK_AGAIN + getCode(userId);
    }

    /**
     *  * 生成人事还款流水号
     *  * @param userId
     *  
     */
    public static String generateHKAgain(Long userId) {
        return PERSON_HK_AGAIN + getCode(userId);
    }

    /**
     *  * 生成人事部门备用金申请流水号
     *  * @param userId
     *  
     */
    public static String generateBYAgain(Long userId) {
        return PERSON_BY_AGAIN + getCode(userId);
    }

    /**
     *  * 采购单流水号
     *  * @param userId
     *  
     */
    public static String generateCGAgain(Long userId) {
        return PERSON_CG_AGAIN + getCode(userId);
    }

    // endregion


    //region  CRM流水号开头及方法调用
    /**
     * 置换单流水号
     */
    private static final String CRM_ZH_AGAIN = "CZH";

    /**
     *  * 生成置换流水号
     *  * @param userId
     *  
     */
    public static String generateCRMZHAgain(Long userId) {
        return CRM_ZH_AGAIN + getCode(userId);
    }

    /**
     * 贷款单流水号
     */
    private static final String CRM_DK_AGAIN = "CDK";

    /**
     *  * 生成贷款流水号
     *  * @param userId
     *  
     */
    public static String generateCRMDKAgain(Long userId) {
        return CRM_DK_AGAIN + getCode(userId);
    }

    /**
     * 收款单流水号
     */
    private static final String CRM_SK_AGAIN = "CSK";

    /**
     *  * 生成收款流水号
     *  * @param userId
     *  
     */
    public static String generateCRMSKAgain(Long userId) {
        return CRM_SK_AGAIN + getCode(userId);
    }
    /**
     * 汇款单流水号
     */
    private static final String CRM_HK_AGAIN = "CHK";

    /**
     *  * 生成汇款流水号
     *  * @param userId
     *  
     */
    public static String generateCRMHKAgain(Long userId) {
        return CRM_HK_AGAIN + getCode(userId);
    }
    /**
     *  报销 单流水号
     */
    private static final String CRM_BX_AGAIN = "CBX";

    /**
     *  * 生成 报销 流水号
     *  * @param userId
     *  
     */
    public static String generateCRMBXAgain(Long userId) {
        return CRM_BX_AGAIN + getCode(userId);
    }
    /**
     *  退车 单流水号
     */
    private static final String CRM_TC_AGAIN = "CTC";

    /**
     *  * 生成 退车 流水号
     *  * @param userId
     *  
     */
    public static String generateCRMTCAgain(Long userId) {
        return CRM_TC_AGAIN + getCode(userId);
    }
    /**
     *  结束订单 单流水号
     */
    private static final String CRM_JSDD_AGAIN = "CJSDD";

    /**
     *  * 生成 结束订单 流水号
     *  * @param userId
     *  
     */
    public static String generateCRMJSDDAgain(Long userId) {
        return CRM_JSDD_AGAIN + getCode(userId);
    }



    /**
     * 过户 单流水号
     */
    private static final String CRM_GH_AGAIN = "CGH";

    /**
     *  * 生成 过户 流水号
     *  * @param userId
     *  
     */
    public static String generateCRMGHAgain(Long userId) {
        return CRM_GH_AGAIN + getCode(userId);
    }
    /**
     * 整备 单流水号
     */
    private static final String CRM_ZB_AGAIN = "CZB";

    /**
     *  * 生成 整备 流水号
     *  * @param userId
     *  
     */
    public static String generateCRMZBAgain(Long userId) {
        return CRM_ZB_AGAIN + getCode(userId);
    }
    /**
     *  维修 单流水号
     */
    private static final String CRM_WX_AGAIN = "CWX";

    /**
     *  * 生成 维修 流水号
     *  * @param userId
     *  
     */
    public static String generateCRMWXAgain(Long userId) {
        return CRM_WX_AGAIN + getCode(userId);
    }
    /**
     *  临牌 单流水号
     */
    private static final String CRM_LP_AGAIN = "CLP";

    /**
     *  * 生成 临牌 流水号
     *  * @param userId
     *  
     */
    public static String generateCRMLPAgain(Long userId) {
        return CRM_LP_AGAIN + getCode(userId);
    }
    /**
     *  运输 单流水号
     */
    private static final String CRM_YS_AGAIN = "CYS";

    /**
     *  * 生成 运输 流水号
     *  * @param userId
     *  
     */
    public static String generateCRMYSAgain(Long userId) {
        return CRM_YS_AGAIN + getCode(userId);
    }
    //endregion

}